home *** CD-ROM | disk | FTP | other *** search
/ Linux Cubed Series 8: LINUX Games / Linux Cubed Series 8 - LINUX Games.iso / games / x11 / strategy / xpat2-1.000 / xpat2-1 / xpat2-1.04 / src / r_mdCanfield.c < prev    next >
C/C++ Source or Header  |  1994-09-28  |  4KB  |  116 lines

  1. /*****************************************************************************/
  2. /*                                         */
  3. /*                                         */
  4. /*    X patience version 2 -- module r_Canfield.c                 */
  5. /*                                         */
  6. /*    Characteristics of the ``Canfield'' rules                 */
  7. /*    written by Michael Bischoff (mbi@mo.math.nat.tu-bs.de)             */
  8. /*    see COPYRIGHT.xpat2 for Copyright details                 */
  9. /*                                         */
  10. /*                                         */
  11. /*****************************************************************************/
  12. #include "xpatgame.h"
  13.  
  14.  
  15. static int baserank;
  16.  
  17. static int Canfield_valid(Cardindex srcind, Pileindex dstpile) {
  18.     int srcpile, dstcard, srccard;
  19.  
  20.     srcpile = getpile(srcind);
  21.     if (srcpile == dstpile)
  22.     return 0;
  23.     if (game.piletype[srcpile] == Stack)
  24.     return 0;
  25.     dstcard = EMPTY(dstpile) ? -1 : game.cards[game.ind[dstpile+1]-1];
  26.     srccard = game.cards[srcind];
  27.     switch (game.piletype[dstpile]) {
  28.     case Slot:    /* moves to Slot: depends on if slot is empty */
  29.     if (EMPTY(dstpile))
  30.         return srcpile == IDECK || (EMPTY(IDECK) && srcpile == VDECK);
  31.     /* dstpile not empty: rank and alternate colour! */
  32.     if (!in_relaxed_sequence(srccard, dstcard))
  33.         return 0;
  34.     if (game.piletype[srcpile] == Slot &&
  35.         srcind != INDEX_OF_FIRST_CARD(srcpile))
  36.         return 0;
  37.     return 1;
  38.     case Tmp:
  39.     case FaceupDeck:
  40.     case FacedownDeck:
  41.     return 0;    /* only implicit moves allowable */
  42.     case Stack:
  43.     if (srcind != INDEX_OF_LAST_CARD(srcpile))
  44.         return 0;    /* only one card at a time */
  45.     if (SUIT(srccard) != SUIT(dstpile))
  46.         return 0;
  47.     if (EMPTY(dstpile))
  48.         return RANK(srccard) == baserank;
  49.     return RANK(srccard) == (1 + RANK(
  50.           game.cards[INDEX_OF_LAST_CARD(dstpile)])) % 13;
  51.     }
  52.     return 0;
  53. }
  54.  
  55. static void Canfield_newgame(void) {
  56.     int i;
  57.     int firstsuit;
  58.     /* specific part: one card on a stack, 3 on the talon (VDECK) */
  59.     for (i = 0; i < rules.numcards; ++i)
  60.     game.visible[i] = 1;
  61.     firstsuit = SUIT(game.cards[0]);
  62.     baserank = RANK(game.cards[0]);
  63.     for (i = 0; i <= firstsuit; ++i)
  64.     game.ind[i] = 0;
  65.     for (; i <= rules.numstacks; ++i)
  66.     game.ind[i] = 1;
  67.     for (; i <= rules.numstacks + rules.numslots; ++i)
  68.     game.ind[i] = 1 + i - rules.numstacks;
  69.     game.ind[VDECK] = 1 + rules.numslots;
  70.     game.ind[IDECK] = 4 + rules.numslots;    /* => 3 on the talon */
  71.     game.ind[IDECK+1] = rules.numcards;
  72. }
  73.  
  74. static int Canfield_score(void) {
  75.     return -52 + 5 * (game.ind[rules.numstacks] - game.counter[1]);
  76. }
  77.  
  78. struct rules modCanfield_rules = {
  79.     "modCanfield",    /* shortname */
  80.     "modified Canfield",/* longname */
  81.     "modcan",   /* abbrev */
  82.     0,        /* layout_hints */
  83.     DECK_SOURCE|DECK_VISIBLE|KLONDIKE_DEAL,/* variant */
  84.     0,        /* customizable */
  85.     0,        /* customized */
  86.     52,        /* numcards */
  87.     4,        /* numstacks */
  88.     4,        /* numslots */
  89.     0,        /* numtmps */
  90.     1,        /* numdecks */
  91.     13,        /* cards_per_color */
  92.     0,        /* numjokers */
  93.     {0, 999, 3, 0},/* param[0], param[1], param[2], param[3] */
  94.     0,        /* facedown */
  95.     1,        /* faceup */
  96.     0,        /* newgame_bits */
  97.     Canfield_newgame,/* new_game */
  98.     NULL,    /* game_won */
  99.     NULL,    /* new_cards */
  100.     ES_ALL|US_RA|MG_RA|ST_ONE|DC_ALWAYS, /* move_bits */
  101.     NULL,    /* deal_cards */
  102.     NULL,    /* undeal_cards */
  103.     NULL,    /* stackable */
  104.     Canfield_valid,    /* movevalid */
  105.     NULL,    /* valid */
  106.     NULL,    /* relaxed_valid */
  107.     NULL,    /* good_hint */
  108.     NULL,    /* automove */
  109.     Canfield_score,/* score */
  110.     208,    /* maxscore */
  111.     {0, TXTI_FLIP, 0, 0}, /* paramstring blocks */
  112.     0,        /* used */
  113.     NULL,    /* initfunc */
  114.     NULL,    /* local keyboard bindings */
  115. };
  116.